package com.zhaojindong.aop;

import lombok.extern.log4j.Log4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * @Aspect: 告诉Spring当前类是一个切面类
 */
@Log4j
@Aspect
public class LogAspects {

    /**
     * 抽取公共的切入点表达式
     * 1. 本类引用：只需要方法名
     * 2. 其他切面引用： 需要写全类名
     */

    // execution中的表达式以 * 开始,表示任意返回值
    // 类名后面的 * 号表示任意方法
    // 括号中的 .. 表示任意参数
    @Pointcut("execution(* com.zhaojindong.aop.MathCalculation.*(..))")
    public void pointCut() {

    }

    // @Before 在目标方法之前切入; 切入点表达式指定了在哪个方法切入
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        String name = joinPoint.getSignature().getName();
        log.info(name + "方法前置通知@Before,参数列表是：" + Arrays.asList(args));
    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        log.info(name + "方法后置通知@After ");
    }

    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result) {
        String name = joinPoint.getSignature().getName();
        log.info(name + "方法返回通知@AfterReturning,正常返回,返回值为：" + result);
    }

    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void logException(JoinPoint joinPoint, Exception exception) {
        String name = joinPoint.getSignature().getName();
        log.info(name + "方法异常通知@AfterThrowing, 异常信息为：" + exception);
    }

}
